﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CruzDelSur.Dominio;
using NHibernate;
using NHibernate.Criterion;

namespace CruzDelSur.Persistencia
{
    public class ConvenioDAO : BaseDAO<Convenio, string>, IConvenioDAO
    {
        public ICollection<Convenio> obtenerListado() 
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                ICollection<Convenio> resultado = sesion.CreateCriteria<Convenio>()
                    .List<Convenio>();
                return resultado;
            }
        }

        public ICollection<Convenio> obtenerListadoPendientes()
        {
            ICollection<Convenio> resultado = this.Listar(
                DetachedCriteria.For<Convenio>().Add(
                    Restrictions.Eq("Estado", Servicio.PENDIENTE)
                   )
                );
            return resultado;
        }
        public Convenio obtenerConvenioDetalle(string codigo)
        {
            Convenio convenio = this.Obtener(codigo);
            convenio.Detalle = this.obtenerDetalle(convenio);
            return convenio;
        }

        public IList<ConvenioDetalle> obtenerDetalle(Convenio convenio)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                    IList<ConvenioDetalle> result = sesion.CreateQuery("from ConvenioDetalle where Codigo=:codigo")
                    .SetString("codigo", convenio.Codigo)
                    .List<ConvenioDetalle>();
                    if (result == null)
                    {
                        return new List<ConvenioDetalle>();
                    }
                    else
                    {
                        return result;
                    }

            }
        }

        public void guardarDetalle(Convenio convenio) {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                using (ITransaction transaccion = sesion.BeginTransaction())
                {
                    sesion.CreateQuery("delete from ConvenioDetalle where Codigo=:codigo")
                    .SetString("codigo", convenio.Codigo)
                    .ExecuteUpdate();
                    foreach (ConvenioDetalle item in convenio.Detalle)
                    {
                        item.Codigo = convenio.Codigo;
                        sesion.Save(item);
                    }
                    transaccion.Commit();
                }
            }
        }

        public bool buscarClienteAsignado(Cliente cliente)
        {
            using (ISession sesion = NHibernateHelper.AbrirSesion())
            {
                 ICollection<Convenio> result = sesion.CreateQuery("from Convenio where Cliente=:clie")
                .SetParameter<Cliente>("clie", cliente)
                .List<Convenio>();
                if (result == null)
                {
                    return false;
                }
                else
                {
                    if (result.Count > 0)
                    {
                        Convenio convenio = result.First<Convenio>();
                        return (convenio.Estado != Servicio.INACTIVO);
                    }
                    else return false;
                }

            }
        }

    }
}